package com.lsnu.ehr.controller;

import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import java.util.Optional;
import java.util.regex.Pattern;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Sort;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.domain.Sort.Order;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.CrossOrigin;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import com.lsnu.ehr.domain.Pages;
import com.lsnu.ehr.domain.Result;
import com.lsnu.ehr.entity.Emp;
import com.lsnu.ehr.entity.Probation;
import com.lsnu.ehr.jpa.DepaRepository;
import com.lsnu.ehr.jpa.EmpRepository;
import com.lsnu.ehr.jpa.PostRepository;
import com.lsnu.ehr.jpa.ProbationRepository;
/**
 * 员工控制器
 * @author 小七
 *
 */
// 以json形式返回
@ResponseBody
// 控制器
@Controller

public class EmpController {
	private static final Integer pageLength = 12;
	// 依赖注入，类似于配置spring的bean
	@Autowired
	EmpRepository repositories;
	@Autowired
	ProbationRepository proRep;
	@Autowired
	PostRepository postRep;
	@Autowired
	DepaRepository depaRep;

	/**
	 * 添加员工
	 * 
	 * @param emp
	 * @return
	 */
	// 允许跨域请求
	@CrossOrigin
	@RequestMapping("addEmp")
	public Object addEmp(Emp emp) {
		// 使用接口直接存储部门，spring会自动代理接口方法
		// 返回值是一个持久态的Emp

		Emp dbEmp = repositories.save(emp);
		boolean flag = (null != dbEmp.getId());
		// 如果员工有试用期 则创建试用期表
		if (emp.getIsPro() && flag) {
			Probation probation = new Probation();
			// 试用期时间为当前录入时间
			probation.setBeginDate(new SimpleDateFormat("yyyy-MM-dd").format(new Date()));
			// 试用结束时间为null
			probation.setEndDate(null);
			// 试用期员工
			probation.setProEmp(dbEmp);
			// 考核结果为“”
			probation.setAssessResult(" ");
			// 试用状态为 正常
			probation.setStatus("正常");
			// 备注为 ‘ ’
			probation.setRemark(" ");

			proRep.save(probation);
		}

		return new Result(1, flag);
	}

	/**
	 * 更新员工
	 * 
	 * @param emp
	 * @return
	 */
	// 允许跨域请求
	@CrossOrigin
	@RequestMapping("updateEmp")
	public Object updateEmp(Emp emp) {
		Boolean flag = false;

		// 通过id查询数据库中的数据
		// Optional集合类,这个集合中最多只有一个数据
		if (emp != null) {

			if (repositories.findById(emp.getId()) != null) {
				repositories.save(emp);
				flag = true;
			}
		}
		return new Result(1, flag);
	}

	/**
	 * 根据id删除员工
	 * 
	 * @param id
	 * @return
	 */
	// 允许跨域请求
	@CrossOrigin
	@RequestMapping("delEmp")
	public Object delEmp(@RequestParam("id") String id) {

		// 使用接口直接存储部门，spring会自动代理接口方法
		// 返回值是一个持久态的Emp
		Boolean flag = false;
		Optional<Emp> opt = repositories.findById(new Long(id));
		if (opt != null) {
			// repositories.deleteById(new Long(id));
			Emp emp = opt.get();
			// 设置可用为false
			emp.setAvailable(false);
			// 保存
			repositories.save(emp);
			flag = true;
		}

		return new Result(1, flag);
	}

	/**
	 * 根据当前页数进行分页查询查询所有员工
	 * 
	 * @param page
	 * @return
	 */
	@SuppressWarnings("deprecation")
	@CrossOrigin
	@RequestMapping("findEmp")
	public Object findEmp(@RequestParam("page") Integer page) {

		Order order = new Order(Direction.ASC, "id"); // 根据字段id进行排序
		// 分页排序查询
		PageRequest pageRequest = new PageRequest(page - 1, pageLength, new Sort(order));
		// 分页查询
		List<Emp> emps = repositories.findByAvailableTrue(pageRequest);
		
		return new Result(1, emps, new Pages(page, (int)repositories.count(), pageLength), "成功！");
	}

	/**
	 * 根据id查询员工
	 * 
	 * @return
	 */
	@CrossOrigin
	@RequestMapping("findEmpById")
	public Object findEmpById(@RequestParam("id") String id) {
		Result result = new Result(1);
		Emp emp = null;
		Optional<Emp> opt = repositories.findById(new Long(id));
		if(opt != null) {
			emp = opt.get();
		}
		
		result.setData(emp);
		result.setPage(new Pages(1, 1, pageLength));
		return result;
	}

	/**
	 * 根据key分页查询员工
	 * 
	 * @param key
	 * @param page
	 * @return
	 */
	@SuppressWarnings("deprecation")
	@CrossOrigin
	@RequestMapping("findEmpByKey")
	public Object findEmpByKey( String key, Integer page) {
		System.out.println("page:"+page);
		if(null == page) {
			page = 1;
		}
		
		if("".equals(key)) {
			return findEmp(page);
		}
		// key是否为数字
		Boolean flag = true;
		Integer count;  // 数据总条数
		Order order = new Order(Direction.ASC, "id"); // 根据字段id进行排序
		// 分页排序查询
		PageRequest pageRequest = new PageRequest(page - 1, pageLength, new Sort(order));
		if (page <= 0)
			page = 1;

		List<Emp> emps;

		// 判断是否全是数字
		Pattern pattern = Pattern.compile("^[-\\+]?[\\d]*$");
		flag = pattern.matcher(key).matches();  
		
		if (flag) {
			return findEmpById(key);
		}
		// 是否为部门
		else if (depaRep.findByDepaName(key).size() > 0) {
			count = repositories.findByDepaNameCount(key).intValue();
			emps = repositories.findByDepaName(key, (page - 1) * pageLength, pageLength);
		}
		// 是否为岗位
		else if (postRep.findByPostName(key).size() > 0) {
			count = repositories.findByPostNameCount(key).intValue();
			emps = repositories.findByPostName(key, (page - 1) * pageLength, pageLength);
		}
		// 为员工姓名
		else {
			count = repositories.findByEmpNameLikeCount("%"+key+"%").intValue();
			emps = repositories.findByEmpNameLike(pageRequest, "%" + key + "%");
		}
		
		Result result = new Result();
		result.setData(emps);
		result.setCode(1);
		result.setPage(new Pages(page, count, pageLength));
		return result;
	}
	/**
	 * 姓名模糊查询
	 * @param key
	 * @return
	 */
	@RequestMapping("finda")
	public Object finda(@RequestParam("key") String key) {
		Order order = new Order(Direction.ASC, "id"); // 根据字段id进行排序
		// 分页排序查询
		@SuppressWarnings("deprecation")
		PageRequest pageRequest = new PageRequest(1 - 1, pageLength, new Sort(order));
		return repositories.findByEmpNameLike(pageRequest, "%" + key + "%");
	}
}